package cn.levi.excel.validate;

import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.expression.ExpressionUtil;
import cn.levi.excel.annotation.Excell;
import cn.levi.excel.module.StateBo;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.util.Map;
import org.springframework.stereotype.Component;

/**
 * 校验日期
 *
 * @author lei
 * @since 2024/10/15
 */
@Component
public class ValidateDate implements ValidateExcelImport{

	/**
	 * 可解析的时间格式
	 */
	public final static String[] DATE_TIME_FORMATS =new String[]{"yyyy-MM-dd HH:mm:ss",
			"yyyy/MM/dd HH:mm:ss",
			"yyyy-MM-dd",
			"yyyy/M/d",
			"yyyy-MM-d",
			"yyyy/MM/dd"} ;

	/**
	 * 预检测时间格式正则
	 */
	public final static String[] DATE_TIME_REGEX = new String[]{"^\\d{4}[-/]{1}\\d{1,2}[-/]{1}\\d{1,2}$","^\\d{4}[-/]{1}\\d{1,2}[-/]{1}\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$"};
	/**
	 * 校验是否通过
	 *
	 * @param field         字段
	 * @param excellDataRow excel一行数据 其中key已经转还为bean属性 但是value为excel的原始数据，
	 * @return
	 */
	@Override
	public StateBo validate(Field field, Map<String, Object> excellDataRow) {
		String fieldValue = getFieldValue(field, excellDataRow);
		if (StrUtil.isBlank(fieldValue)) {
			return StateBo.success();
		}
		//从定义好的解析格式化池中获取格式
		if (parseLocalDateTime(fieldValue)==null) {
			Excell excell = AnnotationUtil.getAnnotation(field, Excell.class);
			return StateBo.fail(StrUtil.format("{}格式不正确",excell.value()));
		}
		return StateBo.success();
	}


	/**
	 * 解析时间
	 *
	 * @param value 价值
	 * @return
	 */
	public static LocalDateTime parseLocalDateTime(String value) {
		//从定义好的解析格式化池中获取格式
		for (String dateTimeFormat : DATE_TIME_FORMATS) {
			try {
				//先用日期时间尝试
				return LocalDateTimeUtil.parse(value, dateTimeFormat);
			} catch (Exception ignored) {
				try {
					//再用日期尝试
					return LocalDateTimeUtil.of(LocalDateTimeUtil.parseDate(value, dateTimeFormat));
				} catch (Exception ignored2) {
				}
			}
		}
		return null;
	}

	/**
	 * 验证日期时间,通过定义好的正则预检测
	 *
	 * @param date 日期
	 * @return
	 */
	public static boolean validateDateTime(String date) {
		for (String dateTimeRegex : DATE_TIME_REGEX) {
			if (ReUtil.isMatch(dateTimeRegex,date)) {
				return true;
			}
		}
		return false;
	}
}
